home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 090 / byteibm.arc / CLAFF.ARC / LISTING3.DOC < prev    next >
Encoding:
Text File  |  1985-07-12  |  2.8 KB  |  153 lines

  1.  
  2. ;=======VECTOR STRUCTURE
  3. VECTOR    STRUC
  4. REGIP    DW    ?
  5. REGCS    DW    ?
  6. VECTOR    ENDS
  7. ;=======DATA SEGMENT
  8. DATA    SEGMENT    PUBLIC 'DATA'
  9. CLKDIV    DW    ?    ;<- USER PROVIDED DIVISOR
  10.     PUBLIC    CLKDIV
  11.             ; ACTUAL DIVISOR ...
  12. CLKDIVH    DW    ?    ;...(HIGH WORD)
  13. CLKDIVL    DW    ?    ;...(LOW WORD)
  14. CLKMOD    DW    ?    ; DIVISOR MODULUS
  15. ; USER-PROVIDED NEAR PROCEDURE
  16. CLKRTN    DW    ?
  17.     PUBLIC    CLKRTN
  18. INT08    VECTOR    <>    ;INTERCEPTED INT 008H VECTOR
  19. DATA    ENDS
  20. ;=======STACK SEGMENT
  21. STACK    SEGMENT    STACK 'STACK'
  22. STACK    ENDS
  23. ;=======CODE SEGMENT
  24. CODE    SEGMENT    PUBLIC 'CODE'
  25.     ASSUME    CS:CODE,DS:DATA,ES:DATA,SS:STACK
  26.     EXTRN    SEGCODE:WORD    ;<- CODE SEGMENT
  27.     EXTRN    SEGDATA:WORD    ;<- DATA SEGMENT
  28. ;*******CLKRATE    CLOCK RATE SETTING ROUTINE
  29. CLKRATE    PROC    NEAR
  30. ;-------LOAD COUNTER 0 OF THE 8259
  31.     PUSH    AX
  32.     MOV    AL,00110110B
  33.     OUT    043H,AL
  34.     POP    AX
  35.     OUT    040H,AL
  36.     XCHG    AH,AL
  37.     OUT    040H,AL
  38.     XCHG    AH,AL
  39.     RET
  40. CLKRATE    ENDP
  41. ;*******CLKPRO    CLOCK PROLOGUE
  42. CLKPRO    PROC    NEAR
  43.     PUBLIC    CLKPRO
  44.     PUSH    AX
  45.     PUSH    DX
  46. ;-------INITIALIZE CLK VARIABLES
  47.     XOR    AX,AX
  48.     CALL    CLKRATE
  49.     MOV    CLKDIV,AX
  50.     MOV    CLKDIVH,1
  51.     MOV    CLKDIVL,AX
  52.     MOV    CLKMOD,AX
  53.     MOV    CLKRTN,OFFSET CLKNUL
  54. ;-------SAVE CURRENT INTERRUPT VECTOR
  55.     PUSH    ES
  56.     MOV    AH,035H
  57.     MOV    AL,008H
  58.     INT    021H
  59.     ASSUME    ES:NOTHING
  60.     MOV    INT08.REGIP,BX
  61.     MOV    INT08.REGCS,ES
  62.     POP    ES
  63.     ASSUME    ES:DATA
  64. ;-------INSTALL INTERRUPT INTERCEPT VECTOR
  65.     PUSH    DS
  66.     MOV    AH,025H
  67.     MOV    AL,008H
  68.     MOV    DX,OFFSET CLKINT
  69.     MOV    DS,SEGCODE
  70.     ASSUME    DS:CODE
  71.     INT    021H
  72.     POP    DS
  73.     ASSUME    DS:DATA
  74.     POP    DX
  75.     POP    AX
  76.     RET
  77. CLKPRO    ENDP
  78. ;*******CLKEPI    CLOCK EPILOGUE
  79. CLKEPI    PROC    NEAR
  80.     PUBLIC    CLKEPI
  81.     PUSH    AX
  82.     PUSH    DX
  83. ;-------RESET CLOCK DIVISOR TO 65536
  84.     XOR    AX,AX
  85.     CALL    CLKRATE
  86. ;-------RESET INTERRUPT VECTOR
  87.     PUSH    DS
  88.     MOV    AH,025H
  89.     MOV    AL,008H
  90.     LDS    DX,INT08
  91.     ASSUME    DS:NOTHING
  92.     INT    021H
  93.     POP    DS
  94.     ASSUME    DS:DATA
  95.     POP    DX
  96.     POP    AX
  97.     RET
  98. CLKEPI    ENDP
  99. ;*******INTERRUPT ROUTINES
  100.     ASSUME    CS:CODE,DS:NOTHING,ES:NOTHING
  101.     ASSUME    SS:NOTHING
  102. ;*******CLKINT    CLOCK INTERRUPT INTERCEPT ROUTINE
  103. CLKINT    PROC    FAR
  104.     PUSH    AX
  105.     PUSH    DS
  106.     PUSH    ES
  107. ;-------ESTABLISH ADDRESSABILITY
  108.     MOV    DS,SEGDATA
  109.     ASSUME    DS:DATA
  110.     MOV    ES,SEGDATA
  111.     ASSUME    ES:DATA
  112. ;-------DO USER ROUTINE.
  113.     CALL    CLKRTN
  114. ;-------CHECK FOR ROLL-OVER OF 65536 CYCLES
  115.     MOV    AX,CLKDIVL
  116.     ADD    CLKMOD,AX
  117.     MOV    AX,CLKDIVH
  118.     ADC    AX,0
  119.     JNZ    CLKINT8
  120. ;-------NOT TIME YET, SKIP ORIGINAL INTERRUPT
  121.     MOV    AL,00100000B
  122.     OUT    020H,AL
  123.     JMP    CLKINT7
  124. ;-------DO THE ORIGINAL INTERRUPT.
  125. CLKINT8    LABEL    NEAR
  126.     PUSHF
  127.     CALL    INT08
  128. CLKINT7    LABEL    NEAR
  129. ;-------CHANGE DIVISOR IF SO REQUESTED
  130.     MOV    AX,CLKDIV
  131.     CMP    AX,CLKDIVL
  132.     JE    CLKINTX
  133.     CALL    CLKRATE
  134.     MOV    CLKDIVL,AX
  135.     CMP    AX,1
  136.     MOV    CLKDIVH,0
  137.     ADC    CLKDIVH,0
  138. CLKINTX    LABEL    NEAR
  139.     POP    ES
  140.     ASSUME    ES:NOTHING
  141.     POP    DS
  142.     ASSUME    DS:NOTHING
  143.     POP    AX
  144.     IRET
  145. CLKINT    ENDP
  146. ;*******CLKNUL    INITIAL USER PROVIDED ROUTINE
  147. CLKNUL    PROC    NEAR
  148.     RET
  149. CLKNUL    ENDP
  150. CODE    ENDS
  151.     END
  152.  
  153.